package xyz.fefine;

import java.util.List;

/**
 * Created by feng_ on 2016/9/11.
 */
public class DefStmnt extends ASTList {

    /**
     * 索引,变量数目
     */
    protected int index,size;

    public DefStmnt(List<ASTree> list) {
        super(list);
    }


    public String name() {
        return ((Name)child(0)).name();
    }

    public ParameterList parameters() {
        return (ParameterList) child(1);
    }

    public BlockStmnt body() {
        return (BlockStmnt) child(2);
    }

    @Override
    public String toString() {
        return " (def "+name()+" " + parameters() + " "+body()+") ";
    }

    @Override
    public Object eval(Enviorment enviorment) {
        //1,判断是否为native方法，native方法在最初会被添加进anv中
        //
        Object fun = (ArrayEnv)enviorment.get(0,index);
        if (fun == null){
//            fun = new Function(parameters(), body(), enviorment);
            //2,修改了变量存储方式eval需要进行更新
            fun = new OpFunction(parameters(), body(), enviorment, size);
//            enviorment.putNew(name(), fun);
            // 0 表示最内层,index表示索引
            enviorment.put(0, index, fun);
        }
        return fun;


    }

    /**
     *
     * @param syms 环境
     */
    @Override
    public void lookup(Symbols syms) {
        index = syms.add(name());
        //name lookup
//        ((Name)child(0)).lookup(syms);
        size = this.lookup(syms, parameters(), body());
    }

    /**
     *
     * @param syms 变量存放
     * @param params 参数
     * @param blockStmnt 函数体
     * @return 函数中变量的数目
     */
    public int lookup(Symbols syms, ParameterList params, BlockStmnt blockStmnt) {
        Symbols newSyms = new Symbols(syms);
        params.lookup(newSyms);
        body().lookup(newSyms);
        return newSyms.size();
    }
}
